package com.merept.draw.utils;

import java.util.Scanner;

/**
 * <p>所属包名: com.merept.housemain.utils</p>
 * <p>项目名称: HouseRentSystem</p>
 * <p>文件名称: Utility</p>
 *
 * @author 韩顺平老师
 * @author MerePT
 * @version 1.0
 */
@SuppressWarnings(value = "all")
public class Utility {
    //静态属性。。。
    private static final Scanner scanner = new Scanner(System.in);


    /**
     * 功能: 读取键盘输入的一个菜单选项, 值: 1——5的范围
     *
     * @return 1——5
     */
    public static int readMenuSelection(int i) {
        var c = 0;
        for (; ; ) {
            String str = readKeyBoard(2, false);//包含一个字符的字符串
            c = Integer.parseInt(str);//将字符串转换成字符char类型
            if (c < -1 || c > i) {
                System.out.print("输入错误, 请重新输入 > ");
            } else break;
        }
        return c;
    }

    /**
     * 功能: 读取键盘输入的一个字符
     *
     * @return 一个字符
     */
    public static char readChar() {
        String str = readKeyBoard(1, false);//就是一个字符
        return str.charAt(0);
    }

    /**
     * 功能: 读取键盘输入的一个字符, 如果直接按回车, 则返回指定的默认值；否则返回输入的那个字符
     *
     * @param defaultValue 指定的默认值
     * @return 默认值或输入的字符
     */

    public static char readChar(char defaultValue) {
        String str = readKeyBoard(1, true);//要么是空字符串, 要么是一个字符
        return (str.length() == 0) ? defaultValue : str.charAt(0);
    }

    /**
     * 功能: 读取键盘输入的整型, 长度小于2位
     *
     * @return 整数
     */
    public static int readInt() {
        int n;
        for (; ; ) {
            String str = readKeyBoard(11, false);//一个整数, 长度<=10位
            try {
                n = Integer.parseInt(str);//将字符串转换成整数
                break;
            } catch (NumberFormatException e) {
                System.out.print("数字输入错误, 请重新输入 > ");
            }
        }
        return n;
    }

    /**
     * 功能: 读取键盘输入的 整数或默认值, 如果直接回车, 则返回默认值, 否则返回输入的整数
     *
     * @param defaultValue 指定的默认值
     * @return 整数或默认值
     */
    public static int readInt(int defaultValue) {
        int n;
        for (; ; ) {
            String str = readKeyBoard(true);
            if (str.equals("")) {
                return defaultValue;
            }

            //异常处理...
            try {
                n = Integer.parseInt(str);
                break;
            } catch (NumberFormatException e) {
                System.out.print("数字输入错误, 请重新输入 > ");
            }
        }
        return n;
    }

    /**
     * 功能: 读取键盘输入的长整型
     *
     * @return 长整型
     */
    public static long readLong() {
        long n;
        for (; ; ) {
            String str = readKeyBoard(false);//一个整数, 长度<=10位
            try {
                n = Long.parseLong(str);//将字符串转换成整数
                break;
            } catch (NumberFormatException e) {
                System.out.print("数字输入错误, 请重新输入 > ");
            }
        }
        return n;
    }

    /**
     * 功能: 读取键盘输入的 整数或默认值, 如果直接回车, 则返回默认值, 否则返回输入的整数
     *
     * @param defaultValue 指定的默认值
     * @return 长整数或默认值
     */
    public static long readLong(long defaultValue) {
        long n;
        for (; ; ) {
            String str = readKeyBoard(true);
            if (str.equals("")) {
                return defaultValue;
            }

            //异常处理...
            try {
                n = Long.parseLong(str);
                break;
            } catch (NumberFormatException e) {
                System.out.print("数字输入错误, 请重新输入 > ");
            }
        }
        return n;
    }

    /**
     * 功能: 读取键盘输入的指定长度的字符串
     *
     * @param limit 限制的长度
     * @return 指定长度的字符串
     */
    public static String readString(int limit) {
        return readKeyBoard(limit, false);
    }

    /**
     * 功能: 读取键盘输入的字符串
     *
     * @return 指定长度的字符串
     */
    public static String readString() {
        return readKeyBoard(false);
    }

    /**
     * 功能: 读取键盘输入的指定长度的字符串或默认值, 如果直接回车, 返回默认值, 否则返回字符串
     *
     * @param limit        限制的长度
     * @param defaultValue 指定的默认值
     * @return 指定长度的字符串
     */
    public static String readString(int limit, String defaultValue) {
        String str = readKeyBoard(limit, true);
        return str.equals("") ? defaultValue : str;
    }

    /**
     * 功能: 读取键盘输入的字符串或默认值, 如果直接回车, 返回默认值, 否则返回字符串
     *
     * @param defaultValue 指定的默认值
     * @return 指定长度的字符串
     */
    public static String readString(String defaultValue) {
        String str = readKeyBoard(true);
        return str.equals("") ? defaultValue : str;
    }

    /**
     * 功能: 读取键盘输入的确认选项, Y或N
     * 将小的功能, 封装到一个方法中.
     *
     * @return Y或N
     */
    public static char readConfirmSelection() {
        System.out.print("请输入你的选择(Y/N) > ");
        char c;
        for (; ; ) {//无限循环
            //在这里, 将接受到字符, 转成了大写字母
            //y => Y n=>N
            String str = readKeyBoard(1, false).toUpperCase();
            c = str.charAt(0);
            if (c == 'Y' || c == 'N') {
                break;
            } else {
                System.out.print("选择错误, 请重新输入 > ");
            }
        }
        return c;
    }

    /**
     * 功能:  读取一个字符串
     *
     * @param limit       读取的长度
     * @param blankReturn 如果为true ,表示 可以读空字符串。
     *                    如果为false表示 不能读空字符串。
     *                    <p>
     *                    如果输入为空, 或者输入大于limit的长度, 就会提示重新输入。
     * @return 输入的字符串
     */
    private static String readKeyBoard(int limit, boolean blankReturn) {

        //定义了字符串
        String line = "";

        //scanner.hasNextLine() 判断有没有下一行
        while (scanner.hasNextLine()) {
            line = scanner.nextLine();//读取这一行

            //如果line.length=0, 即用户没有输入任何内容, 直接回车
            if (line.length() == 0) {
                if (blankReturn) return line;//如果blankReturn=true,可以返回空串
                else continue; //如果blankReturn=false,不接受空串, 必须输入内容
            }

            //如果用户输入的内容大于了 limit, 就提示重写输入
            //如果用户如的内容 >0 <= limit ,我就接受
            if (line.length() > limit) {
                System.out.print("输入长度不能大于 " + limit + " , 输入错误, 请重新输入 > ");
                continue;
            }
            break;
        }

        return line;
    }

    /**
     * 功能:  读取一个字符串, 无上限
     *
     * @param blankReturn 如果为true ,表示 可以读空字符串。
     *                    如果为false表示 不能读空字符串。
     *                    <p>
     *                    如果输入为空, 或者输入大于limit的长度, 就会提示重新输入。
     * @return 输入的字符串
     */
    private static String readKeyBoard(boolean blankReturn) {

        //定义了字符串
        String line = "";

        //scanner.hasNextLine() 判断有没有下一行
        while (scanner.hasNextLine()) {
            line = scanner.nextLine();//读取这一行

            //如果line.length=0, 即用户没有输入任何内容, 直接回车
            if (line.length() == 0) {
                if (blankReturn) return line;//如果blankReturn=true,可以返回空串
                else continue; //如果blankReturn=false,不接受空串, 必须输入内容
            }
            break;
        }

        return line;
    }

    /**
     * 功能: 读取键盘回车，完成回车继续功能
     */
    public static void readEnter() {
        var line = scanner.nextLine();
        if (line.length() != 0) line = "";
        System.out.print(line);
    }
}
